﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using CapaNegocio;
using ModeloDatos;
using Util;

namespace CapaPresentacion
{
    public partial class FrmGenerarPedido : Form
    {
        //Declaración de objetos
        Facturas objFacturaE = new Facturas();
        FacturaNE objFacturaNE = new FacturaNE();

        List<Detalle> objDetalleEn = new List<Detalle>();

        DetalleNE objDetalleNE = new DetalleNE();
        //List<Producto> objProducto;
        //ProductoNE objProductoNE;

        Producto prod = new Producto();

        List<Producto> listaProd = new List<Producto>();

        ProductoNE objProNE = new ProductoNE();
        //ClientesNE objClienteNE;
        //int idFactura;
        //bool Facturas;
        //bool DetalleFac;

        public Cliente c = new Cliente();
        public static string dniCliente;

        public static int idProducto;

        public int idVendedor = MDIPrincipal.idVendedor;
        public string num_fact;

        public void cargarCombo()
        {
            try
            {
                this.cboProducto.DataSource = null;
                listaProd = objProNE.listarProductos();
                this.cboProducto.DataSource = listaProd;
                this.cboProducto.DisplayMember = "NombreProducto";
                this.cboProducto.ValueMember = "IdProducto";
                this.cboProducto.Text = "<Seleccionar Prod>";
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }


        }

        public void buscarProductos(int codigo)
        {
            try
            {
                Producto obProd = new Producto();
                obProd = this.objProNE.listarProducto(codigo);
                this.txtIdProducto.Text = obProd.IdProducto.ToString();
                this.txt_Descripcion.Text = obProd.NombreProducto;
                this.txt_precio.Text = obProd.PVProducto.ToString();
                this.txtStockProducto.Text = obProd.StockProducto.ToString();
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void cargarVendedor()
        {
            int codigo = idVendedor;
            VendedorNE objVendedorNE = new VendedorNE();
            Vendedor objVendedorE = new Vendedor();
            objVendedorE = objVendedorNE.buscarVendedorById(codigo);
            this.txtCodVendedor.Text = objVendedorE.IdVendedor.ToString();
            this.txtVendedor.Text = objVendedorE.NombreVendedor + " "
                                    + objVendedorE.ApellidoVendedor;

        }

        public  void BuscarCliente(string dniCliente)
        {
            ClientesNE objClienteNE = new ClientesNE();
            objClienteNE = new ClientesNE();
            Cliente objClienteE = new Cliente();

            objClienteE = objClienteNE.buscarClienteByDni(dniCliente);
            if (objClienteE.DNICliente == dniCliente)
            {
                txtIdCliente.Text = objClienteE.IdCliente.ToString();
               txtDNIC.Text = objClienteE.DNICliente;
                txtCliente.Text = objClienteE.NombreCliente + " "
                                        + objClienteE.ApellidoCliente;
                txtTelefonoC.Text = objClienteE.TelefonoCliente;
                txtRUC.Text = objClienteE.RUCCliente;
                txtDireccion.Text = objClienteE.DireccionCliente;
               txtDNIC.Enabled = false;
            }
            else
            {
                MessageBox.Show("Datos No Encontrados Cliente");
                this.txtDNIC.Enabled = true;
                this.txtDNIC.Clear();
                this.txtDNIC.Focus();
                btnBuscarCliente.Enabled = true;
            }
        }

        public void LimpiarCliente()
        {
            this.txtDNIC.Clear();
            this.txtCliente.Clear();
            this.txtIdCliente.Clear();
            this.txtTelefonoC.Clear();
            this.txtDireccion.Clear();
            this.txtRUC.Clear();
        }
        public void LimpiarProducto()
        {
            this.txtIdProducto.Clear();
            this.txt_Descripcion.Clear();
            this.txtStockProducto.Clear();
            this.txt_precio.Clear();
        }


        private void Limpiar()
        {
            txt_cantidad.Clear();
            txt_Descripcion.Clear();
            txt_precio.Clear();
            txtIdProducto.Clear();
            txtStockProducto.Clear();
        }

        private void GuardarPedido()
        {
            if (string.IsNullOrEmpty(txtIdCliente.Text))
            {
                MessageBox.Show("Ingrese Nombre del Cliente",
                    "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtIdCliente.Focus();
            }
            else if (string.IsNullOrEmpty(txtCodVendedor.Text))
            {
                MessageBox.Show("Ingrese la Dirección del Cliente",
                    "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txtCodVendedor.Focus();
            }
            else if (this.dgvDetallePedido.RowCount == 0)
            {
                MessageBox.Show("Ingrese Productos a la Lista",
                                "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txt_cantidad.Focus();
            }
            else if (MessageBox.Show("¿Desea Guardar la Venta?",
                                    "Confirmar", MessageBoxButtons.YesNo,
                    MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes)
            {
                generarPedido();
            }
        }

        private void generarPedido()
        {
            try
            {
                objFacturaE.num_fact = Convert.ToInt32(txtNumFac.Text);
                num_fact = txtNumFac.Text;
                int numFacturas = Convert.ToInt32(txtNumFac.Text);
                objFacturaE.IdCliente = Convert.ToInt32(txtIdCliente.Text);
                objFacturaE.IdVendedor = Convert.ToInt32(txtCodVendedor.Text);
                objFacturaE.Sub_total = Convert.ToDecimal(lbl_vVenta.Text);
                objFacturaE.Igv = Convert.ToDecimal(lbl_Igv.Text);
                objFacturaE.Total = Convert.ToDecimal(lbl_pVenta.Text);
                objFacturaE.Fecha = Convert.ToDateTime(lblFechaVenta.Text);
                string salida = objFacturaNE.AgregarFactura(objFacturaE);
                MessageBox.Show(salida);
                string salidadLista = null;
                for (int n = 0; n <= this.dgvDetallePedido.RowCount - 1; n++)
                {
                    Detalle objDetalleE = new Detalle();
                    objDetalleE.num_fact = numFacturas;
                    objDetalleE.IdProducto = Convert.ToInt32(this.dgvDetallePedido.Rows[n].Cells[0].Value);
                    objDetalleE.CantidadVenta = Convert.ToInt32(this.dgvDetallePedido.Rows[n].Cells[2].Value);
                    objDetalleE.PrecioVenta = Convert.ToDecimal(this.dgvDetallePedido.Rows[n].Cells[3].Value);
                    objDetalleE.Importe = Convert.ToDecimal(this.dgvDetallePedido.Rows[n].Cells[4].Value);
                    objDetalleEn.Add(objDetalleE);
                }
                salidadLista = objDetalleNE.AgregarDetalles1(objDetalleEn);
                MessageBox.Show(salidadLista);
                Btn_Eliminar.Enabled = false;
                Btn_Limpiar.Enabled = false;
                Btn_Guardar.Enabled = false;
                Btn_Imprimir.Enabled = true;
                MessageBox.Show("Venta Guardado Correctamente", "Felicitaciones",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al Guardar los Datos" + ex.Message.ToString(),
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            finally
            {
            }
        }

        private void Verificar_Cajas()
        {
            if (string.IsNullOrEmpty(txt_cantidad.Text))
            {
                txt_cantidad.Focus();
                return;
            }
            else if (string.IsNullOrEmpty(txt_Descripcion.Text.Trim()))
            {
                txt_Descripcion.Focus();
                return;
            }
            else if (string.IsNullOrEmpty(txt_precio.Text.Trim()))
            {
                txt_precio.Focus();
                return;
            }
            else if ((this.txt_precio.Text.Substring((this.txt_precio.Text.Length - 1)) == "."))
            {
                MessageBox.Show("¡Esto no es un Precio Válido!!!",
                    "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information);
                txt_precio.Focus();
                return;
            }
            else if (Buscar_Producto_Gridview() == false)
            {
                MessageBox.Show("El Producto que intenta Agregar ya existe en la Lista" +
                    "\r" + "Item Seleccionado en la Lista",
                    "Atención", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txt_Descripcion.Focus();
            }
            else
            {
                agregarProductosPedido();
            }
        }

        public void agregarProductosPedido()
        {
            this.dgvDetallePedido.Rows.Add(this.txtIdProducto.Text,
                                           this.txt_Descripcion.Text.Trim(),
                                           txt_cantidad.Text,
                                           this.txt_precio.Text);
            Realizar_Calculo();
            Limpiar();
            this.txt_cantidad.Focus();
        }

        private void Realizar_Calculo()
        {
            double Cantidad;
            double IGV;
            double Total;
            double MTotal;
            //double MVenta;
            //double MIGV;
            double Precio;
            MTotal = 0;
            //MVenta = 0;
            //MIGV = 0;
            lbl_vVenta.Text = "0";
            lbl_Igv.Text = "0";
            lbl_pVenta.Text = "0";
            for (int n = 0; (n
                        <= (dgvDetallePedido.RowCount - 1)); n++)
            {
                Cantidad = double.Parse(dgvDetallePedido.Rows[n].Cells[2].Value.ToString());
                Precio = double.Parse(dgvDetallePedido.Rows[n].Cells[3].Value.ToString());
                Total = (Cantidad * Precio);
                this.dgvDetallePedido.Rows[n].Cells[4].Value = Total.ToString("##,##0.00");
                MTotal = (MTotal + Total);
            }
            lbl_vVenta.Text = MTotal.ToString("##,##0.00");
            IGV = ((MTotal * double.Parse(txt_igvM.Text))
                        / 100);
            lbl_Igv.Text = IGV.ToString("##,##0.00");
            Total = (MTotal + IGV);
            lbl_pVenta.Text = Total.ToString("##,##0.00");
            Convertir_Letras();
        }

        private void Convertir_Letras()
        {
            sisReutilizable objLetras = new sisReutilizable();
            if ((this.dgvDetallePedido.RowCount == 0))
            {
                lbl_numletras.Text = "";
            }
            else
            {
                string numero;
                int cantidad = this.lbl_pVenta.Text.Length;
                numero = lbl_pVenta.Text.Substring(0, (cantidad - 3));
                lbl_numletras.Text = ("SON: "
                            + (objLetras.toText(double.Parse(numero)) + (" CON "
                            + (lbl_pVenta.Text.Substring((lbl_pVenta.Text.Length - 2)) + "/100 NUEVO SOLES"))));
            }
        }

        private bool Buscar_Producto_Gridview()
        {
            for (int n = 0; n <= this.dgvDetallePedido.RowCount - 1; n++)
            {
                if (this.dgvDetallePedido.Rows[n].Cells[1].Value.ToString().Equals(this.txt_Descripcion.Text.Trim()))
                {
                    dgvDetallePedido.CurrentCell = dgvDetallePedido.Rows[n].Cells[1];
                    
                    dgvDetallePedido.Refresh();
                    return false;

                }
            }
            return true;
        }


        public void habilitarBotones(bool nuevo, bool grabar, bool eliminar,
                                        bool imprimir, bool salir, bool cliente)
        {
            this.btnNuevo.Enabled = nuevo;
            this.Btn_Guardar.Enabled = grabar;
            this.Btn_Eliminar.Enabled = eliminar;
            this.Btn_Imprimir.Enabled = imprimir;
            this.Btn_Limpiar.Enabled = salir;
            this.btnBuscarCliente.Enabled = cliente;
        }

        public void configurarGrid()
        {
            dgvDetallePedido.RowsDefaultCellStyle.BackColor = Color.LightGreen;
            dgvDetallePedido.AlternatingRowsDefaultCellStyle.BackColor = Color.LightYellow;

        }
        public FrmGenerarPedido()
        {
            InitializeComponent();
            
            
        }



        private void FrmGenerarPedido_Load(object sender, EventArgs e)
        {
            DateTime Hoy = DateTime.Today;
            string fecha_actual = Hoy.ToString("dd-MM-yyyy");
            lblFechaVenta.Text = DateTime.Now.ToString();
            cargarVendedor();
            cargarCombo();
            habilitarBotones(true, false, false, false, true, false);
            configurarGrid();
        }

        private void cboProducto_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {

                int codigo = System.Convert.ToInt32(cboProducto.SelectedValue.ToString());

                buscarProductos(codigo);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
        }

       

        public void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            try
            {
                txtDNIC.Text = dniCliente;
                if (!string.IsNullOrEmpty(txtDNIC.Text))
                {
                    //string dniCliente = this.txtDNIC.Text;
                    // ActivarCajas(false);
                    btnBuscarCliente.Enabled = false;
                    BuscarCliente(dniCliente);
                }
                else
                {
                    MessageBox.Show("Ingrese el DNI del cliente");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Dato no encontrado" + ex.Message);
            }
        }

        private void txt_cantidad_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                Verificar_Cajas();
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            try
            {
                FacturaNE objFacturaNE = new FacturaNE();
                this.txtNumFac.Text = objFacturaNE.codigoFactura().ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            habilitarBotones(false, true, true, false, true, true);

        }

        private void Btn_Guardar_Click(object sender, EventArgs e)
        {
            GuardarPedido();
            dgvDetallePedido.Rows.Clear();
            LimpiarCliente();
            habilitarBotones(true, false, false, true, true, false);
        }

        private void Btn_Imprimir_Click(object sender, EventArgs e)
        {
            //FrmRptFactura.MiCod_fact = num_fact.ToString();
            //FrmRptFactura.V_Venta = this.lbl_vVenta.Text;
            //FrmRptFactura.IGV = this.lbl_Igv.Text;
            //FrmRptFactura.Total = this.lbl_pVenta.Text;
            //FrmRptFactura.NumeroLetras = this.lbl_numletras.Text;
            //FrmRptFactura rpf = new FrmRptFactura();
            //rpf.Show();
        }       

        private void Btn_Limpiar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txtDNIC_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnCliente_Click(object sender, EventArgs e)
        {
            FrmConClientes fcc = new FrmConClientes();
            fcc.pasado+=new FrmConClientes.pasar(ejecutarCliente);
            fcc.Show();
            btnBuscarCliente.Enabled = true;
        }
        public void ejecutarCliente(int codigo, string nombre, string apellidos,
                                    string dni, string ruc, string telefono,
                                    string direccion)
        {
            txtIdCliente.Text = codigo.ToString();
            txtCliente.Text = nombre + " " + apellidos;
            txtDNIC.Text = dni;
            txtRUC.Text = ruc;
            txtTelefonoC.Text = telefono;
            txtDireccion.Text = direccion;
        }

        private void btnProducto_Click(object sender, EventArgs e)
        {
            FrmConProductos fcp = new FrmConProductos();
            fcp.pasado+=new FrmConProductos.pasar(ejecutarProducto);
            fcp.Show();
            btnBuscarProducto.Enabled = true;
        }
        public void ejecutarProducto(int codigo, string descripcion,decimal pv,int stock)
        {
            txtIdProducto.Text = codigo.ToString();
            txt_Descripcion.Text = descripcion;
            txt_precio.Text = pv.ToString();
            txtStockProducto.Text = stock.ToString();
        }


        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            try
            {
                buscarProductos(idProducto);
                btnBuscarProducto.Enabled = false;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public void eliminarProductoPedido()
        {
            try
            {
                if (dgvDetallePedido.Rows.Count > 0)
                {
                    if (MessageBox.Show("¿Desea Eliminar Producto?",
                                     "Eliminar", MessageBoxButtons.YesNo,
                     MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.Yes)
                    {
                        dgvDetallePedido.Rows.RemoveAt(dgvDetallePedido.CurrentRow.Index);
                        Realizar_Calculo();
                    }
                }
                else
                {
                    MessageBox.Show("No hay Productos en el Pedido");
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("" + ex.Message);
            }
        }

        private void Btn_Eliminar_Click(object sender, EventArgs e)
        {
            eliminarProductoPedido();
        }

        int id;
        private void dgvDetallePedido_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvDetallePedido.Rows.Count>0)
            {
                DataGridViewRow fila = this.dgvDetallePedido.CurrentRow;

                id = dgvDetallePedido.CurrentRow.Index;
              
                txtIdProducto.Text = fila.Cells[0].Value.ToString();
                txt_cantidad.Text = fila.Cells[2].Value.ToString();
                buscarProductos(int.Parse(txtIdProducto.Text));
                btnActualizar.Enabled = true;
            }
        }

        private void btnActualizar_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txt_cantidad.Text))
            {
                MessageBox.Show("Debe ingresar una cantidad");
                txt_cantidad.Focus();
                return;
            }
            else if (int.Parse(txt_cantidad.Text) < 0 || int.Parse(txt_cantidad.Text)==0)
            {
                MessageBox.Show("Debe ingresar una cantidad positiva");
                txt_cantidad.Text = "";
                txt_cantidad.Focus();
                return;
            } else if (int.Parse(txt_cantidad.Text)>int.Parse(txtStockProducto.Text))
            {
                MessageBox.Show("Debe ingresar una cantidad menor al stock");
                txt_cantidad.Text = "";
                txt_cantidad.Focus();
                return;
            }
            else
            {
                dgvDetallePedido.Rows[id].Cells[2].Value = txt_cantidad.Text;
                Realizar_Calculo();
                btnActualizar.Enabled = false;
            }
           
            
        }

      
       

        
    }
}
